package src.itheima02;
/*
    java.lang.Object类 成员方法
        public int hashCode(): 返回该对象的哈希码值。就是一个int数字
        Object类中的hashCode方法,根据对象的地址值,计算一个int数字,叫哈希码值(哈希地址值)
        所以只要使用new创建对象,地址值不相同,所以计算的哈希值也不相同

    注意:
        1.子类不重写hashCode方法,调用Object类的hashCode方法,根据对象地址值计算哈希值
        2.子类根据地址值计算哈希值,没有意义,需要根据内容计算哈希值
        3.所以子类一般需要覆盖重写hashCode方法,根据对象的内容计算哈希值
        4.根据对String的代码测试,发现String覆盖重写了hashCode方法,重写方式: 根据String中的每个字符的ASCII码值,
            按照一定的算法(存在漏洞)进行相加得来
        5.所以比较String的哈希值,其实就是在比较String的内容

    假设: String根据内部的每个字符的ASCII码值相加计算哈希值

    "abc"       哈希值: 97 + 98 + 99 = 294
    "bac"       哈希值: 98 + 97 + 99 = 294


        总结:
            1.如果两个对象的哈希值不同,能否说明两个对象的内容一定不同?
                可以: 哈希值不同,内容必然不相同

            2.如果两个对象的哈希值相同,能否说明两个对象的内容一定相同?
                必须要调用equals方法:
                    true: 相同
                    false: 不相同

            3.加入hashCode方法后,可以减少对equals方法的调用,提高效率

 */
public class Demo03HashCode {
    public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = new Object();
        System.out.println(obj1==obj2);//比较地址值,false

        //计算哈希值
        int h1 = obj1.hashCode();
        int h2 = obj2.hashCode();
        System.out.println(h1);
        System.out.println(h2);

        char[] ch1 = {'a','b','c'};
        String s1 = new String(ch1);
        String s2 = new String(ch1);
        System.out.println(s1==s2);//比较地址值,false
        //计算哈希值
        int h3 = s1.hashCode();
        int h4 = s2.hashCode();
        System.out.println(h3);//96354
        System.out.println(h4);//96354

        String s3 = "农丰";//667668
        String s4 = "儿女";//667668
        String s5 = "重地";//1179395
        String s6 = "通话";//1179395
        System.out.println(s3.hashCode());
        System.out.println(s4.hashCode());
        System.out.println(s5.hashCode());
        System.out.println(s6.hashCode());
    }
}
